package com.oig.sys.msg.service.impl;

import cn.hutool.core.bean.BeanUtil;
import com.oig.common.constants.CommonEnum;
import com.oig.common.exception.BadRequestException;
import com.oig.sys.msg.constants.MsgEnums;
import com.oig.sys.msg.dao.ITbNoticeMsgDao;
import com.oig.sys.msg.dto.NoticeMsgDto;
import com.oig.sys.msg.entity.TbNoticeMsg;
import com.oig.sys.msg.service.ITbNoticeMsgReceiverService;
import com.oig.sys.msg.service.ITbNoticeMsgService;
import com.oig.sys.msg.vo.NoticeMsgVo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;

/**
 * @author wuxl
 */
@Slf4j
@Service
public class TbNoticeMsgServiceImpl implements ITbNoticeMsgService {

	private final ITbNoticeMsgDao tbNoticeMsgDao;
	private final ITbNoticeMsgReceiverService noticeMsgReceiverService;

	@Autowired
	public TbNoticeMsgServiceImpl(ITbNoticeMsgDao tbNoticeMsgDao,
								  ITbNoticeMsgReceiverService noticeMsgReceiverService){
		 this.tbNoticeMsgDao = tbNoticeMsgDao;
		 this.noticeMsgReceiverService = noticeMsgReceiverService;
	}


	@Transactional
	@Override
	public NoticeMsgVo addNoticeMsg(NoticeMsgDto noticeMsgDto){
		if (StringUtils.isBlank(noticeMsgDto.getMsgType())){
			noticeMsgDto.setMsgType(MsgEnums.MsgType.TARGET.getCode());
		} else if (!MsgEnums.MsgType.TARGET.getCode().equals(noticeMsgDto.getMsgType())){
			throw new BadRequestException("手工只能加定向消息");
		}
		TbNoticeMsg noticeMsg = new TbNoticeMsg();
		BeanUtil.copyProperties(noticeMsgDto, noticeMsg, "id");
		//如果提交直接是待审核状态
		if (CommonEnum.FlagEnum.TRUE_FLAG.getCode().equals(noticeMsgDto.getReqType())){
			noticeMsg.setMsgStatus(MsgEnums.MsgStatus.CHECKING.getCode());
		} else {
			noticeMsg.setMsgStatus(MsgEnums.MsgStatus.INIT.getCode());
		}
		noticeMsg.setMsgSource(MsgEnums.MsgSource.OPT.getCode());
		log.debug("info:{}",noticeMsg);
		this.tbNoticeMsgDao.save(noticeMsg) ;
		if (noticeMsgDto.getNoticeMsgReceiverList()!=null){
			this.noticeMsgReceiverService.addReceiver(noticeMsg, noticeMsgDto.getNoticeMsgReceiverList());
		}
		return buildVo(noticeMsg);
	}

	private NoticeMsgVo buildVo(TbNoticeMsg noticeMsg){
		NoticeMsgVo msgVo = new NoticeMsgVo();
		BeanUtil.copyProperties(noticeMsg, msgVo);
		return msgVo ;
	}


	@Transactional
	@Override
	public NoticeMsgVo updateNoticeMsg(NoticeMsgDto noticeMsgDto){
		if (StringUtils.isBlank(noticeMsgDto.getMsgType())){
			noticeMsgDto.setMsgType(MsgEnums.MsgType.TARGET.getCode());
		} else if (!MsgEnums.MsgType.TARGET.getCode().equals(noticeMsgDto.getMsgType())){
			throw new BadRequestException("手工只能加定向消息");
		}
		TbNoticeMsg noticeMsg = this.tbNoticeMsgDao.getNoticeMsgById(noticeMsgDto.getId()) ;
		if (!MsgEnums.MsgStatus.INIT.getCode().equals(noticeMsg.getMsgStatus())
				&&!MsgEnums.MsgStatus.UN_ENABLE.getCode().equals(noticeMsg.getMsgStatus())){
			throw new BadRequestException("只能修改草拟或不通过状态的消息公告") ;
		}
		if (MsgEnums.MsgSource.SYS_NOTICE.getCode().equals(noticeMsg.getMsgSource())){
			throw new BadRequestException("系统消息不能修改") ;
		}
		if (noticeMsgDto.getTenantId()!=0 && !noticeMsgDto.getTenantId().equals(noticeMsg.getTenantId())){
			throw new BadRequestException("无租户权限") ;
		}
		BeanUtil.copyProperties(noticeMsgDto, noticeMsg, "id","tenantId","tenantName","createUserId","createUserName","createTime");
		if (CommonEnum.FlagEnum.TRUE_FLAG.getCode().equals(noticeMsgDto.getReqType())){
			noticeMsg.setMsgStatus(MsgEnums.MsgStatus.CHECKING.getCode());
		}
		log.debug("info:{}",noticeMsg);
		this.tbNoticeMsgDao.save(noticeMsg) ;
		if (noticeMsgDto.getNoticeMsgReceiverList()!=null){
			this.noticeMsgReceiverService.updateReceiver(noticeMsg, noticeMsgDto.getNoticeMsgReceiverList());
		}
		return buildVo(noticeMsg);
	}


	@Transactional
	@Override
	public void delNoticeMsg(Integer id){
		TbNoticeMsg noticeMsg = this.tbNoticeMsgDao.getNoticeMsgById(id);
		if (MsgEnums.MsgStatus.OK.getCode().equals(noticeMsg.getMsgStatus())
				||MsgEnums.MsgStatus.PUBLISH.getCode().equals(noticeMsg.getMsgStatus())){
			throw new BadRequestException("已生效消息不能删除") ;
		}
		this.noticeMsgReceiverService.delByMsgId(id);
		this.tbNoticeMsgDao.delete(noticeMsg);
	}


	@Override
	public NoticeMsgVo getNoticeMsgMainInfo(Integer id) {
		TbNoticeMsg noticeMsg = this.tbNoticeMsgDao.getNoticeMsgById(id);
		if (noticeMsg==null) return null;
		return this.buildVo(noticeMsg);
	}

	@Override
	public NoticeMsgVo getNoticeMsg(Integer id) {
		TbNoticeMsg noticeMsg = this.tbNoticeMsgDao.getNoticeMsgById(id);
		if (noticeMsg==null){
			throw new BadRequestException("消息不存在");
		}
		NoticeMsgVo msgVo = buildVo(noticeMsg);
		if (MsgEnums.ReceiverType.USER.getCode().equals(noticeMsg.getReceiverType())){
			msgVo.setNoticeMsgReceiverList(this.noticeMsgReceiverService.findMsgReceiver(id));
		}
		return msgVo;
	}

	@Transactional
	@Override
	public NoticeMsgVo auditNoticeMsg(NoticeMsgDto noticeMsgDto) {
		TbNoticeMsg noticeMsg = this.tbNoticeMsgDao.getNoticeMsgById(noticeMsgDto.getId());
		if (!MsgEnums.MsgStatus.CHECKING.getCode().equals(noticeMsg.getMsgStatus())){
			throw new BadRequestException("非待复核信息") ;
		}
		if (noticeMsgDto.getTenantId()!=0 && !noticeMsgDto.getTenantId().equals(noticeMsg.getTenantId())){
			throw new BadRequestException("无租户权限") ;
		}
		if (CommonEnum.FlagEnum.TRUE_FLAG.getCode().equals(noticeMsgDto.getReqType())){
			noticeMsg.setMsgStatus(MsgEnums.MsgStatus.OK.getCode());
		} else {
			noticeMsg.setMsgStatus(MsgEnums.MsgStatus.UN_ENABLE.getCode());
		}
		noticeMsg.setCheckRemark(noticeMsgDto.getCheckRemark());
		noticeMsg.setCheckId(noticeMsgDto.getCheckId());
		noticeMsg.setCheckName(noticeMsgDto.getCheckName());
		noticeMsg.setCheckTime(noticeMsgDto.getCheckTime());
		this.tbNoticeMsgDao.save(noticeMsg) ;
		return buildVo(noticeMsg);
	}


	@Transactional
	@Override
	public NoticeMsgVo publishMsg(NoticeMsgDto noticeMsgDto){
		TbNoticeMsg noticeMsg = this.tbNoticeMsgDao.getNoticeMsgById(noticeMsgDto.getId());
		if (!MsgEnums.MsgStatus.OK.getCode().equals(noticeMsg.getMsgStatus())){
			throw new BadRequestException("非生效信息，不能直接发布") ;
		}
		//noticeMsg.setMsgStatus(MsgEnums.MsgStatus.PUBLISH.getCode());
		noticeMsg.setPublisherTime(noticeMsgDto.getPublisherTime());
		noticeMsg.setPublisherId(noticeMsgDto.getPublisherId());
		noticeMsg.setPublisherName(noticeMsgDto.getPublisherName());
		this.tbNoticeMsgDao.save(noticeMsg);
		return buildVo(noticeMsg);
	}



	@Transactional
	@Override
	public NoticeMsgVo addSysNoticeMsg(NoticeMsgDto noticeMsgDto) {
		TbNoticeMsg noticeMsg = new TbNoticeMsg();
		BeanUtil.copyProperties(noticeMsgDto, noticeMsg, "id");
		noticeMsg.setMsgSource(MsgEnums.MsgSource.SYS_NOTICE.getCode());
		noticeMsg.setMsgStatus(MsgEnums.MsgStatus.OK.getCode());
		noticeMsg.setLastUpdateName(noticeMsg.getCreateUserName());
		noticeMsg.setLastUpdateId(noticeMsg.getCreateUserId());
		noticeMsg.setLastUpdateTime(noticeMsg.getCreateTime());
		noticeMsg.setPublisherName(noticeMsg.getCreateUserName());
		noticeMsg.setPublisherId(noticeMsg.getCreateUserId());
		noticeMsg.setPublisherTime(new Date());
		this.tbNoticeMsgDao.save(noticeMsg) ;
		if (noticeMsgDto.getNoticeMsgReceiverList()!=null){
			this.noticeMsgReceiverService.addReceiver(noticeMsg, noticeMsgDto.getNoticeMsgReceiverList());
		}
		return buildVo(noticeMsg);
	}

	@Transactional
	@Override
	public Integer updatePushedUnReadMsgNum(Integer userId) {
		return this.tbNoticeMsgDao.findUnReadSizeByUserId(userId);
	}


	@Transactional
	@Override
	public void updateRead(List<Integer> msgIdList,Integer userId) {
		this.noticeMsgReceiverService.updateUserRead(msgIdList,userId);
	}

	@Transactional
	@Override
	public void updateDel(List<Integer> msgIdList,Integer userId) {
		this.noticeMsgReceiverService.updateUserDel(msgIdList,userId);
	}

	@Transactional
	@Override
	public void updateReadAll(Integer userId) {
		this.noticeMsgReceiverService.updateUserReadAll(userId);
	}

	@Transactional
	@Override
	public void updateDelAll(Integer userId) {
		this.noticeMsgReceiverService.updateUserDelAll(userId);
	}

	@Override
	public List<NoticeMsgVo> findUnSendMsg() {
		return tbNoticeMsgDao.findUnSendMsg();
	}

	@Override
	@Transactional
	public void updateMsgStatusById(Integer id) {
		tbNoticeMsgDao.updateMsgStatusById(id);
	}

	@Override
	@Transactional
	public void updateMsgSendTimes(Integer id) {
		tbNoticeMsgDao.updateSendTimesById(id);
	}
}
